package com.bx.imserver.utils;

import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

/**
 * @ClassName: DoubleBallUtil
 * @Description: 双色球工具类
 * @Author guochuang
 * @Date 2022/1/10
 * @Version 1.0
 */
public class DoubleBallUtil {
    public static void main(String[] args) {
        for (int i =0; i< 1000;i++) {
            int[] ints = randomCommon(0, 33, 7);
            List<Integer> list2 = Arrays.stream(ints).boxed().collect(Collectors.toList());
            System.out.println(list2);
        }

        String[] strings = chooseNumsByMachine();
        System.out.println(Arrays.asList(strings));
        String[] strings1 = chooseNumsByMachine();
        System.out.println(Arrays.asList(strings1));
        isWinningNums(strings,strings1);
    }
    /**
     * 机器为用户进行帮选的功能
     * @return
     */
    public static String[] chooseNumsByMachine() {
        //红色球号码区由1-33共三十三个号码组成，蓝色球号码区由1-16共十六个号码组成。
        //因为双色球的号码都是类似于01，12之类的字符串，因此我们创建一个numsPool数组用来存储01~33的值
        String[] numsPool = {
                "01","02","03","04","05","06","07","08",
                "09","10","11","12","13","14","15","16",
                "17","18","19","20","21","22","23","24",
                "25","26","27","28","29","30","31","32","33"
        };
        //初始化boolean类型的数组numsPoolFlag,默认数值为false
        boolean[] numsPoolFlag = new boolean[33] ;
        //1、进行红球的号码获取
        //初始化长度为6的String类型的userNums数组用来存储用户选择的红色号码
        String[] userNums = new String[6];
        Random random = new Random();
        //循环数组进行值的输入
        for(int i = 0; i < userNums.length; i++) {
            int redNum = 0;
            while(true) {
                redNum = random.nextInt(33);
                //为了使用户输入的数字不重复，进行标志位操作
                //用户所输的数字-1即为numsPoolFlag中所对应的值，默认数值为false即用户输入的数字没有重复
                if (redNum == 0) {
                    break;
                }
                if(numsPoolFlag[redNum-1]) {
                    //表示数字重复，重新生成随机数
                    continue;
                }
                break;
            }
            //将选中的红色号码赋值给用户数组
            userNums[i] = numsPool[redNum];
            //将标志位更改为true
            numsPoolFlag[redNum] = true;
        }
        // 使用 Arrays.sort() 对现有的六个红球号码进行排序
        Arrays.sort(userNums);
        //2、蓝色球号码区由1-16共十六个号码组成
        //初始化int类型的blueNum作为蓝色球的号码
        int blueNum = random.nextInt(16);
        //3、获得蓝球号码后进行红球号码和蓝球号码的拼合
        //复制userNums数组并将数组的长度设置为7
        userNums = Arrays.copyOf(userNums, 7);
        //将userNums数组的最后一位设置为蓝球号码
        userNums[userNums.length-1] = numsPool[blueNum];
        return userNums;
    }
    /**
     * 用户的双色球号码和幸运号码进行对比判断用户是否中奖
     * @param userNums
     * @param luckyNums
     */
    public static void isWinningNums(String[] userNums, String[] luckyNums) {
        /* （1）一等奖：投注号码与当期开奖号码全部相同（顺序不限，下同），即中奖；
         * （2）二等奖：投注号码与当期开奖号码中的6个红色球号码相同，即中奖；
         * （3）三等奖：投注号码与当期开奖号码中的任意5个红色球号码和1个蓝色球号码相同，即中奖；
         * （4）四等奖：投注号码与当期开奖号码中的任意5个红色球号码相同，或与任意4个红色球号码和1个蓝色球号码相同，即中奖；
         * （5）五等奖：投注号码与当期开奖号码中的任意4个红色球号码相同，或与任意3个红色球号码和1个蓝色球号码相同，即中奖；
         * （6）六等奖：投注号码与当期开奖号码中的1个蓝色球号码相同，即中奖。
         */
        //初始化int类型的redSameCount用来存储红色球相同的数量
        int redSameCount = 0;
        //初始化int类型的blueSameCount用来存储蓝色球相同的数量
        int blueSameCount = 0;
        //1、判断红球相等数量
        for(int i = 0; i<userNums.length;i++) {
            for(int j =0; j<luckyNums.length;j++) {
                if(userNums[i].equals(luckyNums[j])) {
                    redSameCount++;
                }
            }
        }
        //2、判断蓝球相等数量
        if(userNums[userNums.length-1].equals(luckyNums[luckyNums.length-1])) {
            blueSameCount++;
        }
        //3、根据红色球和蓝色球的数量匹配奖项
        if(redSameCount == 6 && blueSameCount==1) {
            //一等奖
            System.out.println("恭喜您获得一等奖，奖项是5000万元！");
        }else if(redSameCount == 6) {
            //二等奖
            System.out.println("恭喜您获得二等奖，奖项是1000万元！");
        }else if(redSameCount == 5 && blueSameCount==1) {
            //三等奖
            System.out.println("恭喜您获得三等奖，奖项是500元！");
        }else if(redSameCount == 5 ||redSameCount == 4 && blueSameCount==1) {
            //四等奖
            System.out.println("恭喜您获得四等奖，奖项是200元！");
        }else if(redSameCount == 4 ||redSameCount == 3 && blueSameCount==1) {
            //五等奖
            System.out.println("恭喜您获得五等奖，奖项是10元！");
        }else if(blueSameCount==1) {
            //六等奖
            System.out.println("恭喜您获得六等奖，奖项是5元！");
        }else {
            //未中奖
            System.out.println("很遗憾，您本次未能中奖！！！");
        }
    }
    /**
     * 生成不可重复的随机的双色球号码
     * 下面那个看不清
     */
    public static int[] randomCommon(int min, int max, int n) {
        if (n > (max - min + 1) || max < min) {
            return null;
        }
        int[] result = new int[n];
        int count = 0;
        while (count < n) {
            int num = (int) (Math.random() * (max - min)) + min; // int num = Math.random()*33+
            boolean flag = true;
            for (int j = 0; j < n; j++) { // 遍历arr数组判断是否有重复元素
                if (num == result[j]) {
                    flag = false; // 若有重复元素奖flag置false，不让其继续往数组里面添加元素
                    break; // 结束for循环
                }
            }
            if (flag) { // 若没有重复元素，则添加元素
                result[count] = num;
                count++;
            }
        }
        return result;
    }
}
